package com.mikufufu.blog.security;

import com.mikufufu.blog.common.cache.RedisCache;
import com.mikufufu.blog.common.constant.RedisKey;
import com.mikufufu.blog.common.entity.SysUser;
import com.mikufufu.blog.model.entity.Permission;
import com.mikufufu.blog.model.entity.User;
import com.mikufufu.blog.security.enums.UserStatus;
import com.mikufufu.blog.security.exception.AuthException;
import com.mikufufu.blog.service.PermissionService;
import com.mikufufu.blog.service.RoleService;
import com.mikufufu.blog.utils.SpringUtils;
import com.mikufufu.blog.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * Token存储
 * 
 */
@Slf4j
public class TokenStore {

    private final static String TOKEN_PREFIX = RedisKey.BLOG + RedisKey.USER + RedisKey.TOKEN ;

    /**
     * 生成用户token。
     *
     * @param user 用户对象
     * @return 生成的token字符串
     */
    public static String generateToken(User user) {
        // 生成token
        String token = UUID.randomUUID().toString().replace("-", "");
        log.debug("生成token: {}", token);
        // 将token和对应的用户ID存储到Redis缓存中
        RedisCache.set(TOKEN_PREFIX + token, user, 1, TimeUnit.DAYS);
        return token;
    }

    /**
     * 根据token获取用户对象。
     *
     * @param token 用户的token
     * @return 用户对象
     * @throws RuntimeException 如果token无效，则抛出异常
     */
    public static User getUserInToken(String token) {
        // 从Redis缓存中根据token获取用户ID
        User user = RedisCache.get(TOKEN_PREFIX + token,User.class);
        if (StringUtils.isEmpty(user)) {
            log.debug("token无效");
            return null;
        }
        // 通过用户ID从缓存中获取用户对象
        return user;
    }

    /**
     * 根据token获取系统用户对象，包括权限信息。
     *
     * @param token 用户的token
     * @return 系统用户对象，如果用户不存在则返回null
     */
    public static SysUser getSysUserInToken(String token) {
        // 根据token获取用户对象
        User user = getUserInToken(token);
        if (StringUtils.isEmpty(user)) {
            log.debug("用户不存在");
            return null;
        }
        if(UserStatus.DISABLED.getCode().equals(user.getStatus())){
            throw new AuthException("user.ban");
        }
        // 获取用户权限集合
        Set<String> permissions = SpringUtils.getBean(PermissionService.class).getPermissionSet(user.getRole()).stream().map(Permission::getSign).collect(Collectors.toSet());
        Integer roleId = user.getRole();
        // 根据用户角色获取角色代码
        String roleCode = SpringUtils.getBean(RoleService.class).getCodeById(roleId);
        // 构建并返回系统用户对象
        return new SysUser(user.getId(), user.getUsername(), user.getPassword(),roleId, roleCode, permissions);
    }

    /**
     * 删除指定的token。
     *
     * @param token 要删除的token
     */
    public static void deleteToken(String token) {
        log.debug("删除token: {}", token);
        // 从Redis缓存中删除指定的token
        RedisCache.delete(TOKEN_PREFIX + token);
    }

}
